﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CROSLAND.BL.BE;
using CROSLAND.BL.BC;

namespace CROSLAND.WebApp
{
    public partial class Cliente : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                PanelBusquedaCliente.Visible = true;
                PanelCreacionCliente.Visible = false;
                
                Label lblOrgV = (Label)this.Master.FindControl("lblOrganizacionVenta");
                Label lblCanD = (Label)this.Master.FindControl("lblCanal");
                Label lblOfic = (Label)this.Master.FindControl("lblOficina");
                if (Session["cmbOrgVtas"] != null || Session["cmbCanalDist"] != null || Session["cmbOficina"] != null)
                {
                    lblOrgV.Text = Session["cmbOrgVtas"].ToString();
                    lblCanD.Text = Session["cmbCanalDist"].ToString();
                    lblOfic.Text = Session["cmbOficina"].ToString();
                }
                lblResult.Text = "";
                CargarCombosSesion();
            }
        }

        protected void btnNuevoCliente_Click(object sender, EventArgs e)
        {
            Session["modo"] = "1"; //1 es creacion, 2 modificacion
            this.divCodigo.Visible = false;
            txtNIFCliente.Text = string.Empty;
            txtNombreCliente.Text = string.Empty;
            gvCliente.DataSource = null;
            gvCliente.DataBind();
            PanelBusquedaCliente.Visible = false;
            PanelCreacionCliente.Visible = true;
            LimpiarTextosCliente();
            HabilitaControles(true);
            LabelModo.Text = "Creación de Cliente";
        }

        protected void btnModificarCliente_Click(object sender, EventArgs e)
        {
            if (gvCliente.SelectedIndex >= 0)
            {
                Session["modo"] = "2"; //1 es creacion, 2 modificacion
                PanelBusquedaCliente.Visible = false;
                PanelCreacionCliente.Visible = true;
                HabilitaControles(false);
                LabelModo.Text = "Modificación de Cliente";

                List<ClienteBE> lstCli = (List<ClienteBE>)Session["ListaClientes"];
                int pageI = gvCliente.PageIndex;

                ClienteBE objCli = lstCli[pageI == 0 ? gvCliente.SelectedIndex : gvCliente.SelectedIndex + (pageI * 10)];
                Session["codcli"] = objCli.Codigo;
                txtCodCliente.Text = objCli.Codigo;
                txtNombres.Text = objCli.NOMBRE;
                txtApellidos.Text = objCli.APPAT;
                txtDireccion.Text = objCli.Direccion;
                try { ddlDistrito.Text = objCli.Distrito;
                    ddlDistrito.SelectedValue = objCli.id_Distrito; 
                } catch {}
                try { ddlPoblacion.Text = objCli.Ciudad;
                    ddlPoblacion.SelectedValue = objCli.id_Poblacion; 
                } catch {}
                try { ddlRegion.Text = objCli.region;
                    ddlRegion.SelectedValue = objCli.id_Region;
                }
                catch { }
                txtTelefono.Text = objCli.Telefono;
                txtEmail.Text = objCli.Mail;
                txtNIF.Text = objCli.nif;
                try { ddlNIF.Text = objCli.tipoNif;} catch { }
                try { ddlZonaRegistral.Text = objCli.zonaRegistral;} catch { }
                try { ddlGrupoClientes.Text = objCli.grupoCliente;} catch { }
                try { ddlMoneda.Text = objCli.moneda; } catch { }
            }
        }

        protected void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            List<ClienteBE> lstCli = new List<ClienteBE>();
            UsuarioWebBE uWeb = new UsuarioWebBE();
            uWeb = (UsuarioWebBE)Session["UsuarioWeb"];
            lstCli = ClienteBC.Instance.buscarCliente(txtNIFCliente.Text.Trim(), txtNombreCliente.Text.Trim(), uWeb);
            List<ClienteBE.BancoBE> banco;
            if (lstCli != null && lstCli.Count > 0)
            {
                //Cargo los bancos
                for (int i = 0; i < lstCli.Count; i++)
                {
                    ClienteBE rec = lstCli[i];
                    banco = new List<ClienteBE.BancoBE>();
                    banco = ClienteBC.Instance.listaBanco(rec.Codigo, uWeb.sociedad);
                    if (banco != null)
                    {
                        rec.ListaBanco = banco;
                    }
                }
                Session["ListaClientes"] = lstCli;
                gvCliente.DataSource = lstCli;
                gvCliente.DataBind();
            }
            else
            {
                //gvCliente.EmptyDataText = "No se encontraron registros.";
                gvCliente.DataSource = null;
                gvCliente.DataBind();
                Session["Mensaje"] = "No se encontraron registros.";
                ((Site)Master).muestraMensajes();
            }
        }

        private void LimpiarTextosCliente()
        {
            txtNombres.Text = "";
            txtApellidos.Text = "";
            txtDireccion.Text = "";
            ddlDistrito.SelectedIndex = 0;
            ddlPoblacion.SelectedIndex = 0;
            ddlRegion.SelectedIndex = 0;
            txtTelefono.Text = "";
            txtEmail.Text = "";
            ddlNIF.SelectedIndex = 0;
            txtNIF.Text = "";
            ddlZonaRegistral.SelectedIndex = 0;
            ddlGrupoClientes.SelectedIndex = 0;
            ddlMoneda.SelectedIndex = 0;
        }

        private void HabilitaControles(bool estado)
        {
            ddlNIF.Enabled = estado;
            txtNIF.Enabled = estado;
            ddlZonaRegistral.Enabled = estado;
            ddlGrupoClientes.Enabled = estado;
            ddlMoneda.Enabled = estado;
        }

        protected void btGuardar_Click(object sender, EventArgs e)
        {
            bool res = Valida();
            try
            {
                if (res == true)
                {
                    UsuarioWebBE objU = (UsuarioWebBE)Session["UsuarioWeb"];
                    ClienteBE objCliente = new ClienteBE();
                    objCliente.NOMBRE = txtNombres.Text.Trim();
                    objCliente.APPAT = txtApellidos.Text.Trim();
                    objCliente.Direccion = txtDireccion.Text.Trim();
                    objCliente.id_Distrito = ddlDistrito.SelectedValue;
                    objCliente.Distrito = ddlDistrito.Text;
                    objCliente.id_Poblacion = ddlPoblacion.SelectedValue;
                    objCliente.poblacion = ddlPoblacion.Text;
                    objCliente.Ciudad = ddlPoblacion.SelectedValue;
                    objCliente.id_Region = ddlRegion.SelectedValue;
                    objCliente.region = ddlRegion.Text;
                    objCliente.Telefono = txtTelefono.Text.Trim();
                    objCliente.Mail = txtEmail.Text.Trim();
                    objCliente.nif = txtNIF.Text.Trim();
                    objCliente.tipoNif = ddlNIF.SelectedValue;
                    objCliente.zonaRegistral = ddlZonaRegistral.SelectedValue;
                    objCliente.grupoCliente = ddlGrupoClientes.SelectedValue;
                    objCliente.moneda = ddlMoneda.SelectedValue;
                    string codcli = "";
                    string result = "";
                    if (Session["modo"] == "1") //crear
                    {
                        result = ClienteBC.Instance.creaCliente(objCliente, objU, out codcli);
                        if (result == "")
                        {
                            PanelBusquedaCliente.Visible = true;
                            txtNIFCliente.Text = codcli;
                            PanelCreacionCliente.Visible = false;
                        }
                        else if (result == "El NIF ingresado ya existe")
                        {
                            Session["Mensaje"] = result;
                        }
                        else
                        {
                            PanelBusquedaCliente.Visible = true;
                            PanelCreacionCliente.Visible = false;
                            Session["Mensaje"] = result;
                            this.LimpiarTextosCliente();
                        }
                    }
                    else if (Session["modo"] == "2") //modificar
                    {
                        objCliente.Codigo = Session["codcli"].ToString();
                        result = ClienteBC.Instance.modificaCliente(objCliente, objU);
                        PanelBusquedaCliente.Visible = true;
                        PanelCreacionCliente.Visible = false;
                        Session["Mensaje"] = result;
                        this.LimpiarTextosCliente();
                        gvCliente.DataSource = null;
                        gvCliente.DataBind();
                    }
                }
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
            }
            finally {
                ((Site)Master).muestraMensajes();
            }  
        }

        protected void btnSalir_Click(object sender, EventArgs e)
        {
            lblResult.Text = "";
            LimpiarTextosCliente();
            PanelBusquedaCliente.Visible = true;
            PanelCreacionCliente.Visible = false;
        }

        protected void gvCliente_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            if (Session["ListaClientes"] != null)
            {
                gvCliente.PageIndex = e.NewPageIndex;
                gvCliente.DataSource = (List<ClienteBE>)Session["ListaClientes"];
                gvCliente.DataBind();
            }
        }

        protected void gvCliente_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Select")
            {
                Session["modo"] = "2"; //1 es creacion, 2 modificacion
                this.divCodigo.Visible = true;
                PanelBusquedaCliente.Visible = false;
                PanelCreacionCliente.Visible = true;
                HabilitaControles(false);
                LabelModo.Text = "Modificación de Cliente";
                //CargarCombosSesion();
                List<ClienteBE> lstCli = (List<ClienteBE>)Session["ListaClientes"];
                int pageI = gvCliente.PageIndex;
                GridViewRow gvr = (GridViewRow)(((ImageButton)e.CommandSource).NamingContainer);
                int index = gvr.RowIndex;
                
                ClienteBE objCli = lstCli[pageI == 0 ? index : index + (pageI * 10)];
                Session["codcli"] = objCli.Codigo;
                txtCodCliente.Text = objCli.Codigo;
                txtNombres.Text = objCli.NOMBRE;
                txtApellidos.Text = objCli.APPAT;
                txtDireccion.Text = objCli.Direccion;



                try { ddlRegion.Text = objCli.region; }
                catch { }
                CargandoValoresComboPoblacion();
                try { ddlPoblacion.Text = objCli.Ciudad; }
                catch { }
                CargandoValoresComboDistrito();
                try { ddlDistrito.Text = objCli.Distrito; }
                catch { } 
                txtTelefono.Text = objCli.Telefono;
                txtEmail.Text = objCli.Mail;
                txtNIF.Text = objCli.nif;
                try { ddlNIF.SelectedValue = objCli.tipoNif;} catch { } 
                try { ddlZonaRegistral.SelectedValue = objCli.zonaRegistral;} catch { } 
                try { ddlGrupoClientes.SelectedValue = objCli.grupoCliente;} catch { }
                try { ddlMoneda.SelectedValue = objCli.moneda; }
                catch { } 
            }
        }

        private void CargarCombosSesion()
        {
            if (Session["CargarCombos"] != null)
            {
                List<GenericBE> lstZoR = new List<GenericBE>();
                List<GenericBE> lstGrC = new List<GenericBE>();
                Dictionary<string, List<GenericBE>> dict = (Dictionary<string, List<GenericBE>>)Session["CargarCombos"];

                Session["ZReg"] = dict["zonaregistral"].ToList();
                Session["GCli"] = dict["grupocliente"].ToList();
                
                ddlZonaRegistral.DataTextField = "Descripcion";
                ddlZonaRegistral.DataValueField = "Codigo";
                ddlZonaRegistral.DataSource = dict["zonaregistral"].ToList();
                ddlZonaRegistral.DataBind();

                ddlGrupoClientes.DataTextField = "Descripcion";
                ddlGrupoClientes.DataValueField = "Codigo";
                ddlGrupoClientes.DataSource = dict["grupocliente"].ToList();
                ddlGrupoClientes.DataBind();
            }

            if (Session["Ubigeos"] != null)
            {
                List<UbigeoBE> lstUbi = new List<UbigeoBE>();
                lstUbi = (List<UbigeoBE>)Session["Ubigeos"];

                Session["dRegion"] = (from t in lstUbi group t by new { t.CodigoRegion, t.DesRegion } into grp select new { grp.Key.CodigoRegion, grp.Key.DesRegion }).ToList();
                Session["dPoblacion"] = (from t in lstUbi group t by new { t.CodPoblacion, t.DesPoblacion } into grp select new { grp.Key.CodPoblacion, grp.Key.DesPoblacion }).ToList();
                Session["dDistrito"] = (from t in lstUbi group t by new { t.CodDistrito, t.DesDistrito } into grp select new { grp.Key.CodDistrito, grp.Key.DesDistrito }).ToList();

                ddlRegion.DataTextField = "DesRegion";
                ddlRegion.DataValueField = "CodigoRegion";
                ddlRegion.DataSource = (from t in lstUbi group t by new { t.CodigoRegion, t.DesRegion } into grp select new { grp.Key.CodigoRegion, grp.Key.DesRegion }).ToList();
                ddlRegion.DataBind();

                ddlPoblacion.DataTextField = "DesPoblacion";
                ddlPoblacion.DataValueField = "DesPoblacion";
                ddlPoblacion.DataSource = (from t in lstUbi group t by new { t.CodPoblacion, t.DesPoblacion } into grp select new { grp.Key.CodPoblacion, grp.Key.DesPoblacion }).ToList();
                ddlPoblacion.DataBind();

                ddlDistrito.DataTextField = "DesDistrito";
                ddlDistrito.DataValueField = "DesDistrito";
                ddlDistrito.DataSource = (from t in lstUbi group t by new { t.CodDistrito, t.DesDistrito } into grp select new { grp.Key.CodDistrito, grp.Key.DesDistrito }).ToList();
                ddlDistrito.DataBind();
            }
        }

        private bool Valida()
        {
            bool result = true;
            string msg = string.Empty;
            if (txtNombres.Text.Trim() == "")
            {
                msg = msg + "Ingrese un nombre válido. ";
                result = false;
            }
            if (txtDireccion.Text.Trim() == "")
            {
                msg = msg + "Ingrese una dirección válida. ";
                result = false;
            }
            //if (txtApellidos.Text.Trim() == "")
            //{
            //    msg = msg + "Ingrese los apellidos. ";
            //    result = false;
            //}
            if (txtNIF.Text.Trim() == "")
            {
                msg = msg + "Ingrese un NIF válido. ";
                result = false;
            }
            if (ddlDistrito.SelectedValue == "")
            {
                msg = msg + "Seleccione un distrito válido. ";
                result = false;
            }
            if (ddlPoblacion.SelectedValue == "")
            {
                msg = msg + "Seleccione una población válida. ";
                result = false;
            }
            if (ddlRegion.SelectedValue == "")
            {
                msg = msg + "Seleccione una región válida. ";
                result = false;
            }
            if (ddlNIF.SelectedValue == "")
            {
                msg = msg + "Seleccione un tipo de NIF válido. ";
                result = false;
            }
            if (ddlZonaRegistral.SelectedValue == "")
            {
                msg = msg + "Seleccione la zona registral. ";
                result = false;
            }
            Session["Mensaje"] = msg;
            return result;
        }

        protected void ddlRegion_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                List<UbigeoBE> lstUbi = new List<UbigeoBE>();
                lstUbi = (List<UbigeoBE>)Session["Ubigeos"];

                List<UbigeoBE> lsttmp = (from x in lstUbi where x.CodigoRegion == ddlRegion.SelectedValue select x).ToList();

                ddlPoblacion.DataTextField = "DesPoblacion";
                ddlPoblacion.DataValueField = "DesPoblacion";
                ddlPoblacion.DataSource = (from t in lsttmp group t by new { t.CodPoblacion, t.DesPoblacion } into grp select new { grp.Key.CodPoblacion, grp.Key.DesPoblacion }).ToList();
                ddlPoblacion.DataBind();
            }
            catch 
            {
                
            }
            
        }

        protected void ddlPoblacion_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                List<UbigeoBE> lstUbi = new List<UbigeoBE>();
                lstUbi = (List<UbigeoBE>)Session["Ubigeos"];

                List<UbigeoBE> lsttmp = (from x in lstUbi where x.DesPoblacion == ddlPoblacion.SelectedValue select x).ToList();

                ddlDistrito.DataTextField = "DesDistrito";
                ddlDistrito.DataValueField = "DesDistrito";
                ddlDistrito.DataSource = (from t in lsttmp group t by new { t.CodDistrito, t.DesDistrito } into grp select new { grp.Key.CodDistrito, grp.Key.DesDistrito }).ToList();
                ddlDistrito.DataBind();
            }
            catch 
            {
                
            }
            
        }

        private void CargandoValoresComboPoblacion()
        {
            List<UbigeoBE> lstUbi = new List<UbigeoBE>();
            lstUbi = (List<UbigeoBE>)Session["Ubigeos"];

            List<UbigeoBE> lsttmp = (from x in lstUbi where x.CodigoRegion == ddlRegion.SelectedValue select x).ToList();

            ddlPoblacion.DataTextField = "DesPoblacion";
            ddlPoblacion.DataValueField = "DesPoblacion";
            ddlPoblacion.DataSource = (from t in lsttmp group t by new { t.CodPoblacion, t.DesPoblacion } into grp select new { grp.Key.CodPoblacion, grp.Key.DesPoblacion }).ToList();
            ddlPoblacion.DataBind();
        }

        private void CargandoValoresComboDistrito()
        {
            List<UbigeoBE> lstUbi = new List<UbigeoBE>();
            lstUbi = (List<UbigeoBE>)Session["Ubigeos"];

            List<UbigeoBE> lsttmpx = (from x in lstUbi where x.DesPoblacion == ddlPoblacion.SelectedValue select x).ToList();

            ddlDistrito.DataTextField = "DesDistrito";
            ddlDistrito.DataValueField = "DesDistrito";
            ddlDistrito.DataSource = (from t in lsttmpx group t by new { t.CodDistrito, t.DesDistrito } into grp select new { grp.Key.CodDistrito, grp.Key.DesDistrito }).ToList();
            ddlDistrito.DataBind();
        }
    }
}